package sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import core.Turma;

public class TurmaBD {

private Connection con;
	
	public TurmaBD() {
		
		try {
			Class.forName(BancoDados.driverJDBC);
			con = DriverManager.getConnection(BancoDados.dbMySQL, BancoDados.usuario, BancoDados.senha);
			con.setAutoCommit( false );
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void close() throws ConexaoException {
		try {
			
			Class.forName(BancoDados.driverJDBC);
			con.commit();
			con.close();
			
		} catch (SQLException e) {
			throw new ConexaoException( e.getMessage() );
		} catch (ClassNotFoundException e) {
			throw new ConexaoException( e.getMessage() );
		}
		
	}
	
	public void addTurma( Turma novaTurma ) throws TurmaException {
		Statement st;
		
		if( existeTurmaNome( novaTurma.getNome() ) ) {
			throw new TurmaException( "Nome da Turma já existe." );
		}
		
		CursoBD bd = new CursoBD();
		
		try {
			
			st = con.createStatement();
			st.execute( comandoCadastraTurma( novaTurma.getNome(), bd.getIDCurso( novaTurma.getCurso() ) ) );
			
			con.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (CursoException e) {
			e.printStackTrace();
		}
	}

	public ArrayList<Turma> getTurmas( String nomeTurma ) throws ConexaoException {
		Statement st;
		ResultSet rs;
		
		ArrayList<Turma> lstTurma = new ArrayList<Turma>();
		
		CursoBD bdCurso = new CursoBD();
		ProfessorBD bdProfessor = new ProfessorBD();
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoPesquisaTurma( nomeTurma ) );
			
			while( rs.next() ) {
				
				Turma tempTurma = new Turma( rs.getString("nome"), bdCurso.getCursoPorID( rs.getInt("id_curso") ) );
				tempTurma.setProfessor( bdProfessor.getProfessorPorID( rs.getInt("id_professor") ) );
				
				lstTurma.add( tempTurma );
				
				con.commit();
				
			}
		} catch (SQLException e) {
			throw new ConexaoException( e.getMessage() );
		}
		
		bdCurso.close();
		bdProfessor.close();
		
		return lstTurma;
	}
	
	public Turma getTurma( String nome ) throws TurmaException {
		Statement st;
		ResultSet rs;
		Turma tempTurma = new Turma("", null );
		
		if( ! existeTurmaNome(nome) ) {
			throw new TurmaException("Nome Turma não existe.");
		}
		
		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoTurmaNome(nome) );
			
			if( rs.next() ) {
				
				CursoBD bdCurso = new CursoBD();
				ProfessorBD bdProfessor = new ProfessorBD();
				
				tempTurma.setNome( rs.getString("nome") );
				tempTurma.setCurso( bdCurso.getCursoPorID( rs.getInt("id_curso") ) );
				tempTurma.setProfessor( bdProfessor.getProfessorPorID( rs.getInt("id_professor") ) );
				
				bdCurso.close();
				bdProfessor.close();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return tempTurma;
	}
	
	public void delTurma( String nome ) throws TurmaException {
		Statement st;
		
		if( !existeTurmaNome(nome) ) {
			throw new TurmaException( "Nome Turma não existe." );
		}
		
		try {
			
			st = con.createStatement();
			st.execute( comandoRemoveTurmaNome( nome ) );
			con.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public boolean updateTurma( Turma turma, String nomeAntigo ) { 
		Statement st;

		try {
			
			CursoBD bdCurso = new CursoBD();
			ProfessorBD bdProfessor = new ProfessorBD();
			
			st = con.createStatement();
			st.execute( comandoAtualizaTurma( turma.getNome(), bdProfessor.getIDProfessor( turma.getProfessor() ), bdCurso.getIDCurso( turma.getCurso() ), nomeAntigo ) );

			con.commit();

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (CursoException e) {
			e.printStackTrace();
		} catch (ProfessorException e) {
			e.printStackTrace();
		}
		
		return true;
	}

	private boolean existeTurmaNome( String nome ) {
		
		Statement st;
		ResultSet rs;

		try {
			
			st = con.createStatement();
			rs = st.executeQuery( comandoNomeTurma( nome ) );
			
			int resultado = -1;
			
			if( rs.next() ) {
				resultado = rs.getInt( "id" );
			}
			
			con.commit();
			
			if( resultado < 1 ) {
				return false;
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private String comandoAtualizaTurma(String nome, int idProfessor, int idCurso, String nomeAntigo ) {
		String idProfessorF = "" + idProfessor;
		if( idProfessor < 1 ) {
			idProfessorF = "NULL";
		}
		String saida = "UPDATE turma SET nome = '" + nome + "' , id_professor = " + idProfessorF + " , " +
		" id_curso = " + idCurso + " WHERE STRCMP ( nome , '" + nomeAntigo + "' ) = 0 ;";
		return saida;
	}
	
	private String comandoTurmaNome( String nome ) {
		return "SELECT * FROM turma WHERE STRCMP ( nome , '" + nome + "' ) = 0 ;";
	}
	
	private String comandoRemoveTurmaNome( String nome ) {
		return "DELETE from turma WHERE STRCMP ( nome , '" + nome + "' ) = 0 ;";
	}

	private String comandoNomeTurma( String nome ) {
		return "SELECT id FROM turma WHERE STRCMP ( nome , '" + nome + "' ) = 0 ;";
	}
	
	private String comandoMatriculaAluno( String matricula ) {
		return "SELECT id FROM aluno WHERE STRCMP ( matricula , '" + matricula + "' ) = 0 ;";
	}
	
	private String comandoCadastraTurma( String nome, int id_curso ) {
		return "INSERT INTO turma VALUES ( NULL, '" + nome + "', NULL , " + id_curso + " ) ;";
	}
	
	private String comandoPesquisaTurma( String nome ) {
		return "SELECT * FROM turma WHERE nome LIKE '%" + nome + "%' ;";
	}
	
}
